home *** CD-ROM | disk | FTP | other *** search
/ MacAddict 4 / MacAddict_004_1996_12.iso / Sponsors / Bungie / Abuse Demo / lisp / guns.lsp < prev    next >
Lisp/Scheme  |  1996-08-01  |  12KB  |  438 lines

  1. ;; Copyright 1995 Crack dot Com,  All Rights reserved
  2. ;; See licensing information for more details on usage rights
  3.  
  4.  
  5. /* written in C
  6. (defun gun_draw ()
  7.   (draw_tint (aref gun_tints (aitype))))
  8. */
  9.  
  10. (setq gun_tints (make-array 11 :initial-contents (list 
  11.                           normal_tint
  12.                           (def_tint "art/tints/guns/orange.spe") ; orange
  13.                           (def_tint "art/tints/guns/green.spe")  ; grenade
  14.                           (def_tint "art/tints/guns/redish.spe") ; rocket
  15.                           (def_tint "art/tints/guns/blue.spe")   ; plasma
  16.                           normal_tint
  17.                           normal_tint
  18.                           normal_tint
  19.                           normal_tint
  20.                           normal_tint
  21.                           normal_tint)))
  22.  
  23.  
  24. (setq ai_ammo (make-array 9 :initial-contents (list MBULLET_ICON5 
  25.                         MBULLET_ICON5 
  26.                         GRENADE_ICON2
  27.                         ROCKET_ICON2 
  28.                         PLASMA_ICON20
  29.                         MBULLET_ICON5 
  30.                         MBULLET_ICON5 
  31.                         MBULLET_ICON5 
  32.                         MBULLET_ICON5)))
  33.  
  34. (defun aitype_to_ammo (aitype)
  35.   (aref ai_ammo aitype))
  36.  
  37.  
  38.  
  39. (defun fire_object (creator type x y angle target)
  40.   (select type
  41.  
  42.       (0 (with_object (add_object SHOTGUN_BULLET x y)
  43.                       (progn
  44.                     (play_sound ZAP_SND 127 (x) (y))
  45.                     (setq sgb_lifetime 6)
  46.                     (setq sgb_speed 15)
  47.                     (setq sgb_lastx (x))
  48.                     (setq sgb_lasty (y))
  49.                     (setq sgb_angle angle)
  50.                     (setq sgb_bright_color (find_rgb 255 255 200))
  51.                     (setq sgb_medium_color (find_rgb 150 150 0))
  52.                     (if creator 
  53.                         (progn
  54.                           (setq sgb_speed (+ sgb_speed (/ (xvel) 2)))
  55.                           (link_object creator)))
  56.                     (sgun_ai)
  57.                     )))
  58.       (1 (with_object (add_object SHOTGUN_BULLET x y)
  59.                       (progn
  60.                     (play_sound ZAP_SND 127 (x) (y))
  61.                     (setq sgb_lifetime 40)
  62.                     (setq sgb_speed 6)
  63.                     (setq sgb_lastx (x))
  64.                     (setq sgb_lasty (y))
  65.                     (setq sgb_angle angle)
  66.                     
  67.                     (setq sgb_bright_color (find_rgb 255 128 64))
  68.                     (setq sgb_medium_color (find_rgb 255 0 0))
  69.                     (if creator 
  70.                         (progn
  71.                           (setq sgb_speed (+ sgb_speed (/ (xvel) 2)))
  72.                           (link_object creator)))
  73.                     (sgun_ai)
  74.                     )))
  75.       (2 (with_object (add_object GRENADE x y)
  76.               (progn
  77.                 (play_sound GRENADE_THROW 127 x y)
  78.                 (set_course angle 20)
  79.                 (if creator    
  80.                 (progn
  81.                   (link_object creator)
  82.                   (set_xvel (+ (xvel) (with_object creator (xvel))))
  83.                   (set_yvel (+ (yvel) (with_object creator (yvel))))
  84.                   ))
  85.                 
  86.                 (set_frame_angle 0 359 angle)
  87.                 )))
  88.       (3 (with_object (add_object ROCKET x y)
  89.               (progn
  90.                 (play_sound ROCKET_LAUNCH_SND 127 x y)
  91.                 (set_aistate angle)
  92.                 (if creator    (link_object creator))
  93.  
  94.                 (if (and target   ;; don't link if not in line of site
  95.                      (can_see (x) (y) 
  96.                           (with_object target (x))
  97.                           (with_object target (y)) nil))
  98.                           (link_object target))
  99.  
  100.                 (set_frame_angle 0 359 angle)
  101.                 (setq speed 5)
  102.                 (if (and creator (with_object creator (isa_player)))
  103.                 (setq max_speed 14)
  104.                   (setq max_speed 10))
  105.                 (set_y (+ (y) (/ (picture_height) 2)))  ;; move down to match frame/pos
  106.                 )))
  107.  
  108.       (4 (with_object (add_object PLASMAGUN_BULLET x y)
  109.                       (progn
  110.                     (play_sound PLASMA_SND 127 (x) (y))
  111.                     (setq sgb_lastx (x))
  112.                     (setq sgb_lasty (y))
  113.                     (if creator 
  114.                           (link_object creator))
  115.                     (set_course angle 200)
  116.                     (let ((old_x (x))
  117.                           (old_y (y))
  118.                           (bx (bmove (if (> (total_objects) 0) (get_object 0) nil))))
  119.                       (if (not (eq bx T))
  120.                           (if (eq bx nil)
  121.                           (add_object EXPLODE5 (- (x) (random 5)) 
  122.                                   (- (y) (random 5)) 0)
  123.                         (progn
  124.                           (add_object EXPLODE3 (- (x) (random 5)) 
  125.                                   (- (y) (random 5)) 0)
  126.                           (do_damage 10 bx (* (cos sgb_angle) 20) 
  127.                                  (* (sin sgb_angle) 10)))))
  128.                       (setq sgb_lastx (x))
  129.                       (setq sgb_lasty (y))
  130.                       (set_x old_x)
  131.                       (set_y old_y))
  132.                     )))
  133.  
  134.  
  135.       (5 (with_object (add_object FIREBOMB x y)
  136.               (progn
  137.                 (play_sound FIREBOMB_SND 127 (x) (y))
  138.                 (set_course angle 20)
  139.                 (if creator    
  140.                 (progn
  141.                   (link_object creator)
  142.                   (set_yvel (+ (yvel) (with_object creator (yvel))))
  143.                   )))))
  144.  
  145.       (6 (with_object (add_object DFRIS_BULLET x y)
  146.                       (progn
  147.                     (play_sound ROCKET_LAUNCH_SND 127 x y)
  148.                     (set_course angle 25)
  149.                     (set_aistate angle)
  150.                     (if creator 
  151.                           (link_object creator))
  152.                     (dfris_ai)
  153.                     )))
  154.  
  155.       (7 (with_object (add_object LSABER_BULLET x y)
  156.                       (progn
  157.                     (play_sound LSABER_SND 127 (x) (y))
  158.                     (setq sgb_lastx (x))
  159.                     (setq sgb_lasty (y))
  160.                     (if creator 
  161.                           (link_object creator))
  162.                     (set_course angle 45)
  163.                     (let ((bx (bmove (if (> (total_objects) 0) (get_object 0) nil))))
  164.                       (if (not (eq bx T))
  165.                           (if (not (eq bx nil))
  166.                           (do_damage 30 bx (* (cos sgb_angle) 20) 
  167.                                  (* (sin sgb_angle) 10)))))
  168.                     )))
  169.                
  170.  
  171.       (9 (with_object (add_object STRAIT_ROCKET x y)
  172.                       (progn
  173.                     (play_sound MGUN_SND 127 (x) (y))
  174.                     (if creator 
  175.                           (link_object creator))
  176.                     (set_aistate angle)
  177.                     (set_frame_angle 0 359 angle)
  178.                     (play_sound GRENADE_THROW 127 (x) (y)))))
  179.  
  180.       (10 (with_object (add_object SHOTGUN_BULLET x y)
  181.                       (progn
  182.                     (play_sound ZAP_SND 127 (x) (y))
  183.                     (setq sgb_lifetime 6)
  184.                     (setq sgb_speed 15)
  185.                     (setq sgb_lastx (x))
  186.                     (setq sgb_lasty (y))
  187.                     (setq sgb_angle angle)
  188.                     (setq sgb_bright_color (find_rgb 255 0 0))
  189.                     (setq sgb_medium_color (find_rgb 150 0 0))
  190.                     (if creator 
  191.                         (progn
  192.                           (setq sgb_speed (+ sgb_speed (/ (xvel) 2)))
  193.                           (link_object creator)))
  194.                     (sgun_ai)
  195.                     )))
  196.  
  197.       ) 
  198. )
  199.  
  200.  
  201. (defun spray_fire ()
  202.   (fire_object (me) (aitype)
  203.            (+ (x) (* (cos spray.angle) 20))
  204.            (- (- (y) 21) (* (sin spray.angle) 22))
  205.            spray.angle
  206.            (bg)))
  207.  
  208.  
  209. (defun spray_gun_ai ()
  210.   (if (<= (hp) 0)
  211.       nil
  212.     (if (and (< (distx) 450) (< (disty) 400))
  213.     (progn
  214.       (select (aistate)
  215.           (0;; look at sensor
  216.            (if (activated)
  217.                (if (eq (state) stopped)
  218.                (progn
  219.                  (set_targetable T)
  220.                  (set_state spray.appear)
  221.                  (go_state 1))
  222.              (go_state 3))
  223.              (progn
  224.                (set_targetable nil)
  225.                (set_state stopped))))
  226.  
  227.  
  228.           (1;; unfold
  229.            (if (next_picture) T 
  230.              (progn (set_aistate 3)
  231.                 (set_state spray.aim)
  232.                 (setq spray.angle spray.start_angle)
  233.                 (set_frame_angle 0 359 spray.angle)
  234.                 )))
  235.  
  236.           (2;; fold up
  237.            (if (next_picture) T 
  238.              (progn (set_state stopped)
  239.                 (set_aistate 0))))
  240.  
  241.          
  242.           (3;; swivel down
  243.            (if (> (state_time) spray.fire_delay)
  244.                (progn
  245.              (set_aistate 3);; reset state time
  246.              (setq spray.angle (- spray.angle spray.angle_speed))
  247.              (if (<= spray.angle spray.start_angle)
  248.                  (progn
  249.                    (setq spray.angle spray.start_angle)
  250.                    (set_aistate 4)))
  251.              (set_frame_angle 0 359 spray.angle)
  252.              (spray_fire))))
  253.  
  254.           (4;; swivel up
  255.            (if (> (state_time) spray.fire_delay)
  256.                (progn
  257.              (set_aistate 4);; reset state time
  258.              (setq spray.angle (+ spray.angle spray.angle_speed))
  259.              (if (>= spray.angle spray.end_angle)
  260.                  (progn
  261.                    (setq spray.angle spray.end_angle)
  262.                    (set_aistate 0)))
  263.              (set_frame_angle 0 359 spray.angle)
  264.  
  265.              (spray_fire)))))
  266.       T)
  267.       (progn
  268.     (set_state stopped)
  269.     T))))
  270.         
  271.  
  272.           
  273.           
  274.     (defun spray_gun_cons () 
  275.       (setq spray.bullet_speed 20)
  276.       (setq spray.angle_speed  10)
  277.       (setq spray.start_angle  270)
  278.       (setq spray.end_angle    350)
  279.       (setq spray.fire_delay 4))
  280.  
  281. (def_char SPRAY_GUN
  282.   (funs (ai_fun       spray_gun_ai)
  283.     (damage_fun   guner_damage)
  284.     (draw_fun     gun_draw)
  285.     (constructor spray_gun_cons))
  286.  
  287.   (flags (can_block  T)
  288.      (hurtable   T))
  289.   (abilities (start_hp 20)
  290.          )
  291.   (vars spray.fire_delay
  292.     spray.bullet_speed
  293.     spray.start_angle
  294.     spray.end_angle
  295.     spray.angle_speed
  296.     spray.angle)     
  297.  
  298.   (fields ("hp"                 ai_health)
  299.       ("aitype"             ai_type)
  300.       ("spray.fire_delay"   spray_delay)
  301.       ("spray.start_angle"  spray_start)
  302.       ("spray.end_angle"    spray_end)
  303.       ("spray.angle_speed"  spray_speed)
  304.       ("spray.angle"        spray_cangle))
  305.  
  306.   (states "art/gun2.spe"
  307.       (stopped           "stopped")
  308.       (spray.aim         (seq "cspn" 1 24))
  309.       (spray.appear      '("csht0001.pcx" "csht0002.pcx"))
  310.       (spray.disappear   '("csht0002.pcx" "csht0001.pcx"))
  311.       ))
  312.  
  313.  
  314.  
  315. (def_char TRACK_GUN
  316.   (vars 
  317.     fire_delay            ; how long between each shot
  318.     fire_delay_left
  319.         track_speed           ; how fast the gun can chage it's angle
  320.  
  321.     burst_total           ; how many shots to fire with fire_delay in between each
  322.     burst_total_left
  323.     continue_time         ; how much time to wait before continue tracking
  324.     continue_time_left
  325.     track_start_angle     ; min angle gun will track
  326.     track_end_angle       ; max
  327.     angle)
  328.  
  329.  
  330.   (funs (ai_fun      track_ai)
  331.     (constructor track_cons)
  332.     (draw_fun    gun_draw)
  333.     (damage_fun   guner_damage))    
  334.  
  335.   (flags (can_block  T)
  336.      (hurtable   T))
  337.  
  338.   (abilities (start_hp 20))
  339.  
  340.   (fields ("hp"                ai_health)
  341.       ("aitype"            ai_type)
  342.       ("track_speed"       d_track_speed)
  343.       ("fire_delay"        track_fspeed)
  344.       ("burst_total"       track_burst)
  345.       ("continue_time"     track_cont)
  346.       ("track_start_angle" track_sangle)
  347.       ("track_end_angle"   track_eangle)
  348.       ("angle"             track_cangle))
  349.  
  350.   (states "art/gun2.spe"
  351.       (stopped  "stopped")
  352.       (opening  '("csht0001.pcx" "csht0002.pcx"))
  353.       (shuting  '("csht0002.pcx" "csht0001.pcx"))
  354.       (spinning (seq "cspn" 1 24))
  355.       (firing   (seq "cfr1" 1 24))))
  356.  
  357. (defun track_cons ()
  358.   (setq angle 270)
  359.   (setq track_speed 1)
  360.   (setq fire_delay  5)
  361.   (setq burst_total 3)
  362.   (setq continue_time 8)
  363.   (setq track_start_angle 180)
  364.   (setq track_end_angle   359))
  365.  
  366. (defun track_fire ()
  367.   (fire_object (me) (aitype)
  368.            (+ (x) (* (cos angle) 18))
  369.            (- (- (y) 15) (* (sin angle) 15))
  370.            (mod (+ angle (- 2 (random 5))) 360)
  371.            (bg))
  372.   (if (or (eq burst_total_left 0) (eq burst_total_left 1))
  373.       (setq continue_time_left continue_time)
  374.     (progn
  375.       (setq burst_total_left (- burst_total_left 1))
  376.       (setq fire_delay_left fire_delay)))
  377.  
  378.  
  379.   (set_state firing)
  380.   (set_frame_angle 0 359 angle))
  381.  
  382. (defun track_set_angle (new_angle)
  383.   (if (> track_start_angle track_end_angle)
  384.       (if (and (>= new_angle track_end_angle) (<= new_angle track_start_angle))
  385.       (setq angle new_angle))
  386.     (if (and (<= new_angle track_end_angle) (>= new_angle track_start_angle))
  387.     (setq angle new_angle))))
  388.  
  389. (defun track_ai ()   
  390.   (if (eq (hp) 0)                                                  ;; are we dead?
  391.       nil
  392.     (if (activated)                                   ;; see if we should be on
  393.     (if (eq (state) stopped)
  394.         (progn
  395.           (set_targetable T)
  396.           (set_state opening)
  397.           T)
  398.       (if (and (eq (state) opening) (next_picture))
  399.           T
  400.         (progn
  401.           (set_state spinning)
  402.           (set_frame_angle 0 359 angle)
  403.  
  404.           (if (eq continue_time_left 0);; do we need to wait?
  405.           (if (eq fire_delay_left 0)
  406.               ;; get the angle to the player
  407.               (let ((pangle (atan2 (- (- (y) (with_object (bg) (y))) -8)
  408.                        (- (with_object (bg) (x)) (x) ))))
  409.             (let ((clock_dist (if (< pangle angle);; calculate clockwise angle distance
  410.                           (- angle pangle)
  411.                         (+ angle (- 360 pangle)))))
  412.               (let ((closest_dist (if (> clock_dist 180) 
  413.                           (- 360 clock_dist)
  414.                         clock_dist)))
  415.                 (let ((angle_add (if (>= closest_dist track_speed)
  416.                          track_speed
  417.                            closest_dist)))
  418.                   (if (> clock_dist 180);; should we steer clowck wise or counter?
  419.                   (track_set_angle (mod (+ angle angle_add) 360))
  420.                 (track_set_angle (mod (+ (- angle angle_add) 360) 360)))
  421.                   (if (< angle_add 5);; pretty close to target, FIRE!                
  422.                   (track_fire))))))
  423.             (setq fire_delay_left (- fire_delay_left 1)))
  424.         (progn
  425.           (setq continue_time_left (- continue_time_left 1))
  426.           (if (eq continue_time_left 0)
  427.               (setq burst_total_left burst_total))))
  428.           T)))
  429.       (progn
  430.     (set_targetable nil)
  431.     (set_state stopped)
  432.     T))))  
  433.       
  434.     
  435.  
  436.  
  437.  
  438.